#ifndef __SkiaHost_H__
#define __SkiaHost_H__
#pragma once
#include "stdafx.h"
#include <SDL2/SDL.h>
#include "FCLib.h"
using namespace FaceCat;
using namespace std;

class SkiaTimer{
public:
    SkiaTimer();
    virtual ~SkiaTimer();
    int m_interval;
    int m_tick;
    int m_timerID;
};

/**
* 设备管理
*/
class SkiaHost : public FCHost{
public:
    /**
 * 是否可以操作
 */
    bool m_allowOperate;
    /**
     * 是否支持局部绘图
     */
    bool m_allowPartialPaint;
    /**
     * 方法库
     */
    FCNative *m_native;
    /*
     * 鼠标位置
     */
    FCPoint m_touchPoint;
    ArrayList<FCRect> m_clipBounds;
    FCSize m_clientSize;
    FCSize getClientSize();
    std::map<int, SkiaTimer*> m_timers;
    FCLock m_lock;
    /**
     * 调用视图线程方法的流水号
     */
    int m_invokeSerialID;
    /**
     * 调用视图线程方法的参数
     */
    std::map<int, Object> m_invokeArgs;
    /**
     * 调用视图线程方法的视图
     */
    std::map<int, FCView*> m_invokeViews;
    SDL_Window *m_window;
public:
    /*
     * 构造函数
     */
    SkiaHost();
    /*
     * 析构函数
     */
    virtual ~SkiaHost();
    /**
     * 获取方法库
     */
    virtual FCNative* getNative();
    /**
     * 设置方法库
     */
    virtual void setNative(FCNative *value);
public:
    /*
     * 激活镜像
     */
    virtual void activeMirror();
    /**
     * 是否允许操作
     */
    virtual bool allowOperate();
    /**
     * 是否允许局部绘图
     */
    virtual bool allowPartialPaint();
    /**
     * 在控件的线程中调用方法
     */
    virtual void beginInvoke(FCView *view, Object args);
    /**
     * 复制文本
     */
    virtual void copy(lstring text);
    /**
     * 创建内部控件
     */
    virtual FCView* createInternalView(FCView *parent, const String& clsid);
    /*
     * 获取光标形状
     */
    virtual FCCursors getCursor();
    /**
     * 获取矩形相交区
     *
     * @param lpDestRect    相交矩形
     * @param lpSrc1Rect    矩形1
     * @param lpSrc2Rect    矩形2
     * @returns 是否相交
     */
    virtual int getIntersectRect(FCRect *lpDestRect, const FCRect *lpSrc1Rect, const FCRect *lpSrc2Rect);
    /**
     * 获取触摸位置
     */
    virtual FCPoint getTouchPoint();
    /**
     * 获取尺寸
     */
    virtual FCSize getSize();
    /*
     * 获取矩形联合区
     */
    virtual int getUnionRect(FCRect *lpDestRect, const FCRect *lpSrc1Rect, const FCRect *lpSrc2Rect);
    /**
     * 刷新绘图
     */
    virtual void invalidate();
    /**
     *  刷新绘图
     * @param rect 区域
     */
    virtual void invalidate(const FCRect& rect);
    /**
     *  在控件的线程中调用方法
     * @param view 控件
     * @param args  参数
     */
    virtual void invoke(FCView *view, Object args);
    /*
     * 键盘是否被按下
     */
    virtual bool isKeyPress(char key);
    /*
     * 重绘方法
     */
    void onPaint(const FCRect& rect);
    void onMessage();
    /*
     * 秒表方法
     */
    void onTimer();
    /**
     * 获取粘贴文本
     */
    virtual lstring paste();
    /**
     * 设置是否允许操作
     */
    virtual void setAllowOperate(bool allowOperate);
    /**
     * 设置是否允许局部绘图
     */
    virtual void setAllowPartialPaint(bool allowPartialPaint);
    /*
     * 设置鼠标形状
     */
    virtual void setCursor(FCCursors cursor);
    /**
     *  显示提示框
     * @param text  文字
     * @param mp    位置
     */
    virtual void showToolTip(const String& text, const FCPoint& mp);
    /**
     *  开启秒表
     * @param timerID   秒表ID
     * @param interval  间隔
     */
    virtual void startTimer(int timerID, int interval);
    /**
     *  停止秒表
     * @param timerID   秒表ID
     */
    virtual void stopTimer(int timerID);
};

#endif
